import re

"""
re.match 尝试从字符串的起始位置匹配一个模式，匹配成功re.match方法返回一个匹配的对象，如果不是起始位置匹配成功的话，match()就返回none
语法：re.match(pattern, string, flags=0)
    pattern	匹配的正则表达式
    string	要匹配的字符串。
    flags	标志位，用于控制正则表达式的匹配方式，如：是否区分大小写，多行匹配等等。参见：正则表达式修饰符 - 可选标志
    
    group(num=0)	匹配的整个表达式的字符串，group() 可以一次输入多个组号，在这种情况下它将返回一个包含那些组所对应值的元组。
    groups()	返回一个包含所有小组字符串的元组，从 1 到 所含的小组号。

re.sub(pattern, repl, string, count=0, flags=0)  字符串替换，前三个为必选参数，后两个为可选参数
    pattern : 正则中的模式字符串。
    repl : 替换的字符串，也可为一个函数。
    string : 要被查找替换的原始字符串。
    count : 模式匹配后替换的最大次数，默认 0 表示替换所有的匹配。
    flags : 编译时用的匹配模式，数字形式

compile 函数用于编译正则表达式，生成一个正则表达式（ Pattern ）对象，供 match() 和 search() 这两个函数使用。
    re.compile(pattern[, flags])
    pattern : 一个字符串形式的正则表达式
    flags 可选，表示匹配模式，比如忽略大小写，多行模式等，具体参数为：
    re.I 忽略大小写
    re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
    re.M 多行模式
    re.S 即为' . '并且包括换行符在内的任意字符（' . '不包括换行符）
    re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
    re.X 为了增加可读性，忽略空格和' # '后面的注释

findall 在字符串中找到正则表达式所匹配的所有子串，并返回一个列表，如果有多个匹配模式，则返回元组列表，如果没有找到匹配的，则返回空列表。
    注意： match 和 search 是匹配一次 findall 匹配所有
    re.findall(pattern, string, flags=0) 或 pattern.findall(string[, pos[, endpos]])
    参数：
    pattern 匹配模式。
    string 待匹配的字符串。
    pos 可选参数，指定字符串的起始位置，默认为 0。
    endpos 可选参数，指定字符串的结束位置，默认为字符串的长度。

re.finditer 和 findall 类似，在字符串中找到正则表达式所匹配的所有子串，并把它们作为一个迭代器返回
    re.finditer(pattern, string, flags=0)
    pattern	匹配的正则表达式
    string	要匹配的字符串。
    flags	标志位，用于控制正则表达式的匹配方式，如：是否区分大小写，多行匹配等等。参见：正则表达式修饰符 - 可选标志
    
re.split 方法按照能够匹配的子串将字符串分割后返回列表
    re.split(pattern, string[, maxsplit=0, flags=0])
    pattern	匹配的正则表达式
    string	要匹配的字符串。
    maxsplit	分割次数，maxsplit=1 分割一次，默认为 0，不限制次数。
    flags	标志位，用于控制正则表达式的匹配方式，如：是否区分大小写，多行匹配等等。参见：正则表达式修饰符 - 可选标志

"""

def str_ret():
    return "aa"

def str_reg():
    #========>字符串查找
    # 校验abc 是否在起始位置出现，如果不在起始位置则返回none
    result = re.match("abc", "abc-def-eee")
    print("起始位置是否匹配 : ", result.span())

    ## .* 表示任意匹配除换行符（\n、\r）之外的任何单个或多个字符
    # (.*?) 表示"非贪婪"模式，只保存第一个匹配到的子串
    # 验证中间位置是否含有ed ，
    result = re.match("(.*)ed(.*)", "abc-def-ed-ee")
    print(" 是否匹配 : ", result.group())  # 返回匹配到的内容
    print(" 是否匹配 : ", result.groups())  # 返回匹配到的内容的元组格式
    print(" 是否匹配 : ", result.group(1))  # 返回匹配的元组[1]内容
    print(" 是否匹配 : ", result.group(2))  # 返回匹配元组[2]内容

    text = "you are my friend"
    result = re.search(r'are', text, re.M | re.I)
    print(" 是否匹配 : ", result.group())

    #===========> 字符串替换
    phone = "2004-959-559 # 这是一个电话号码"

    # 把"-"替换成空
    # re.sub(r'#.*$', "", phone)    删除#后面的内容
    num = re.sub("-", "", phone)
    print("电话号码 : ", num)

    # 移除非数字的内容
    num = re.sub(r'\D', "", phone)
    print("电话号码 : ", num)

    #compile 函数
    pattern = re.compile(r'\d+')  # 用于匹配至少一个数字 编译正则表达式
    result = pattern.match('one12twothree34four')  # 查找头部，没有匹配
    print(f'匹配结果：{result}')

    # findall 示例 写法1
    result = re.findall(r'\d+', 'runoob 123 google 456')
    print(f'findall 匹配结果：{result}')
    #写法2
    pattern = re.compile(r'\d+')  # 查找数字
    result = pattern.findall('runoob 123 google 456')
    print(f'写法2 findall 匹配结果：{result}')

    #finditer  示例
    it = re.finditer(r"\d+", "12a32bc43jf3")
    for match in it:
        print(match.group())

    #split 示例
    result = re.split(',', 'Tom,Jim,Tina,Jenney')
    print(f'split 分割结果：{result}')
    result = re.split('a', 'hello world')  # 对于一个找不到匹配的字符串而言，split 不会对其作出分割
    print(f'split 分割结果：{result}')

if __name__ == '__main__':
    str_reg()
